import numpy
import matplotlib.pyplot as plt
from scipy import stats

'''
Pyplot 是 Matplotlib 的子库，提供了和 MATLAB 类似的绘图 API。
Pyplot 是常用的绘图模块，能很方便让用户绘制 2D 图表。
Pyplot 包含一系列绘图函数的相关函数，每个函数会对当前的图像进行一些修改，例如：给图像加上标记，生新的图像，在图像中产生新的绘图区域等等。
使用的时候，我们可以使用 import 导入 pyplot 库，并设置一个别名 plt：
常用方法：
1.hist(list,num)，生成num个柱状图
2.scatter(x_list,y_list)，两个list在x轴与y轴，生成散点图
3.
'''

'''
numpy 科学计算的模块
常用方法：
1.mean(list)，得到list的平均数
2.median(list)，得到list的中位数/中间数
3.std(list),得到标准差，标识离散数据的分散程度，越小越接近平均值
4.var(list),得到方差，也是标准差的平方
5.percentile(list,num)，得到百分数，比如num=75,意味着在list中，75%的人，在list中的一个数以下
6.random.uniform(var1,var2,size)生成随机浮点数的数组，在[var1,var2]之间创建size个数据
    6.1 random.randint(var1,var2,size)生成整数的数组，在[var1,var2]之间创建size个数据
    6.2 random.normal(avg,std,size)标准差std,平均值avg,生成size个数据
SciPy 数学包
1、mode(list)，得到list中出现最多的数
2、linregress(x_list,y_list)，得到列表x与列表y的线性相关数据，主要用于预测未来数据
    使用规则：slope, intercept, r, p, std_err = stats.linregress(car_ages, car_spread)返回参数如下：
    2.1 slope：线性k,又称斜率
    2.2  intercept,到y轴的偏移，截距
    2.3 r,又称为r平方，范围是 0 到 1，其中 0 表示不相关，而 1 表示 100％ 相关
'''


# 定义正态数据分布，典型的钟形曲线
def random_normal():
    # normal(平均值，方差，产生随机数据数量)
    fan_age_range = numpy.random.normal(25.0, 0.1, 100000)
    plt.hist(fan_age_range, 80)
    plt.show()


# 定义散点图方法
def plt_scatter():
    car_ages = numpy.random.randint(0, 20, 100)
    car_spread = numpy.random.uniform(5, 140, 100)
    plt.scatter(car_ages, car_spread)
    plt.show()


# 定义线性回归方法,并打印记录
def plt_line_plot():
    car_ages = numpy.random.randint(0, 20, 100)
    car_spread = numpy.random.uniform(5, 140, 100)
    slope, intercept, r, p, std_err = stats.linregress(car_ages, car_spread)

    # 固定用法，根据x坐标(age)，生成一个新数y，跟x是线性关系slope * x + intercept
    my_func = lambda x: slope * x + intercept
    '''
    def my_func(x):
        y = slope * x + intercept
        return y
    '''
    # 生成新的list，用于生成回归线
    car_age_map = map(my_func, car_ages)
    print("type:%s,value:%s" % (type(car_age_map), car_ages))
    car_list = list(car_age_map)
    print("type:%s,value:%s" % (type(car_list), car_list))
    my_mode = list(map(my_func, car_ages))
    plt.scatter(car_ages, car_spread)
    plt.plot(car_ages, my_mode)
    plt.show()


def plt_line(forecast_num):
    x = [5, 7, 8, 7, 2, 17, 2, 9, 4, 11, 12, 9, 6]
    y = [99, 86, 87, 88, 111, 86, 103, 87, 94, 78, 77, 85, 86]

    slope, intercept, r, p, std_err = stats.linregress(x, y)

    print("r 平方值的范围是 0 到 1，其中 0 表示不相关，而 1 表示 100％ 相关。:", r)

    def myfunc(x):
        return slope * x + intercept

    speed = myfunc(forecast_num)

    print("车龄%s年预测的速度是%s" % (forecast_num, speed))


# random_normal()
# plt_scatter()
# plt_line_plot()
plt_line_plot()
